import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase abstracta que representa un segmento de Piso
 * 
 * @author (Programacion Orientada A Objetos - Gonzalez Donat - Neri Andriano) 
 * @version (9/05/12)
 */
public abstract class Piso extends Actor
{
    protected Mono mono;        //Hace referencia al mono
    protected int dir;          //Indica la direccion a la que se encuentra inclinado el piso
    protected int limbrin;      //coordenada en x que una vez rebasada el mono puede brincar
    protected Escenario mundo;  //Referencia al mundo
    
    /**
     * Constructor para la clase Piso
     * @param rotacion (true para una inclinacion de 45° a la derecha
     *                  false para una inclinacion de 45° a la izquierda)
     * @param m mono con el que interactuara
     */
    public Piso(boolean rotacion,Mono m)
    {
        mono = m;
        this.gira(rotacion);      
        limbrin = 0;
        mundo = (Escenario)this.getWorld();
    }
    /**
     * Constructor para la clase Piso
     * @param m mono con el que interactuara
     */
    public Piso(Mono m)
    {
        mono = m;
        dir = Mono.NODIR;
        limbrin = 0;
        mundo = (Escenario)this.getWorld();
    }
    /**
     * Asigna el limite de altura del mono con respecto al piso en 
     * el cual el mono podra brincar en el caso en el que el brinco 
     * sea hacia el mismo lado de la inclinacion del piso
     */
    public void asignaLim()
    {
        limbrin = (int)(this.getY()-(this.getImage().getWidth()/2)*Math.sin(45*Math.PI/180));
    }
    /**
     * Asigna la nueva localizacion del mono 
     * cuando el piso esta inclinado
     */
    public void monoCaminando(int monodir)
    {
        if(dir == monodir){
            if(monodir == Mono.DER)
                mono.setLocation(mono.getX()-1,mono.getY()-2);
            if(monodir == Mono.IZQ)
                mono.setLocation(mono.getX()+1,mono.getY()-2);
        }
        if(dir != monodir && dir != Mono.NODIR){
            if(monodir == Mono.DER)
                mono.setLocation(mono.getX()-1,mono.getY()+2);
            if(monodir == Mono.IZQ)
                mono.setLocation(mono.getX()+1,mono.getY()+2);
        }
    }
    /**
     * Verifica si el mono intenta brincar dentro del limite permitido
     * @param monodir direccion hacia la que se 
     *                encuentra volteado el mono
     * @return true en caso de que este fuera del limite
     * @return false en caso contrario
     */
    public boolean monoBrincando(int monodir)
    {
        this.asignaLim();
        if(dir == monodir && dir!=Mono.NODIR && !puedeBrincar()) 
            return false;
        return true;
    }
    /**
     * Indica si puede brincar o no esto en 
     * base al limite asignado para permitirlo
     * @return true en caso de que este fuera del 
     *              limite permitido del piso
     * @return false en caso contrario
     */
    public boolean puedeBrincar()
    {
        if(mono.getY() < limbrin+5)
            return true;
        return false;
                
    }
    /**
     * Gira el piso un angulo de 45°
     * @param rota (true para sentido contrareloj
     *              false para sentido reloj)
     */
    public void gira(boolean rota)
    {
        if(rota){
            dir = Mono.DER;
            this.turn(-45);
        }
        else{
            dir = Mono.IZQ;
            this.turn(45);
        }
    }
}
